/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.muni.fi.rum.sender;

import cz.muni.fi.rum.reflector.telnet.TelnetServer;
import cz.muni.fi.rum.sender.SenderManagerImpl.SenderMode;
import cz.muni.fi.rum.sender.command.RapMessage;
import cz.muni.fi.rum.sender.command.RapRequest;
import cz.muni.fi.rum.sender.command.RapResponse;
import cz.muni.fi.rum.sender.command.history.CommandHistoryManager;
import cz.muni.fi.rum.sender.listener.SenderListener;
import cz.muni.fi.rum.sender.senders.BufferSender;
import cz.muni.fi.rum.sender.senders.ForceSender;
import cz.muni.fi.rum.sender.senders.MainSender;
import cz.muni.fi.rum.sender.senders.MessageSender;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdesktop.application.Task;

/**
 *
 * @author pmikulasek
 */
public interface SenderManager {

    /**
     * Metoda vytvori {@link RapRequest} na zaklade klice a parametru a prida jej do fronty na odeslani.
     *
     * @param key klic podle ktereho bude vytvoren urcity typ commandu.
     * @param params jednotlive parametry pro konkretni RapRequesty.
     * @return vraci list jeste neodeslanych {@link RapRequest} objektu. Seznam muze byt prazdny v pripade ze jsou jiz vsechny requesty odeslany.
     * @see MainSender
     * @see BufferSender
     * @see ForceSender
     * @throws V pripade nenajiti klice v properties souboru.
     */
    public List<RapRequest> addRequest(String key, Map<String, String> params) throws SenderException;

    /**
     * Metoda odebere na zaklade id {@link RapRequest} z fronty dosud neodeslanych requestu.
     *
     * @param requestId cislo identifikujici <code>RapRequest</code> ktery ma byt odebran.
     * @see MainSender
     * @see BufferSender
     * @see ForceSender
     */
    public void removeRequest(RapRequest request);

    /**
     * Metoda zajisti odeslani vsech dosud neodeslanych <code>RapRequest</code> zprav.
     * @see MainSender
     * @see BufferSender
     * @see ForceSender
     */
    public Task sendAllRequest();

    /**
     * Metoda pro zjisteni historie vykonanych requestu.
     *
     * @return Seznam jiz provedenych <code>RapRequest</code> prikazu.
     * @see CommandHistoryManager#getAllRequest() 
     */
    public Set<RapRequest> getAllExecutedRequests();

    /**
     * Metoda vrati Vsechny provedene requesty a k nim jejich response, serazene podle poradi vykonani.
     * Tedy seznam obsahujici celou historii komunikace s Reflektorem.
     *
     * @return Seznam jiz provedenych <code>RapRequest</code> prikazu a jejich <code>RapResponse</code>.
     * @see CommandHistoryManager#getAllHistory() 
     */
    public List<RapMessage> getHistoryLog();

    /**
     * Specialni metoda. Vrati {@link RapResponse} odpoved, ktera byla vracena pro prislusny {@link RapRequest}. 
     * Tato odpoved je ziskana podle requestu zadaneho pomoci <code>requestId</code>.
     *
     * @param requestId Identifikacni cislo <code>RapRequestu</code>
     * @return <code>RapResponse</code> ktera je odpovedi na <code>RapRequest</code>.
     * @see CommandHistoryManager#getResponseByRequestId(java.lang.Long)
     */
    public RapResponse getResponseByRequestId(Long requestId);

    /**
     * Specialni metoda. Vrati {@link RapResponse} odpoved, ktera byla vracena pro prislusny {@link RapRequest}.
     * Tato odpoved je ziskana podle requestu.
     *
     * @param request <code>RapRequest</code> ke kteremu pozadujeme <code>RapResponse</code>
     * @return <code>RapResponse</code> ktera je odpovedi na <code>RapRequest</code>.
     * @see CommandHistoryManager#getResponseByRequest(cz.muni.fi.rum.sender.command.RapRequest)
     */
    public RapResponse getResponseByRequest(RapRequest request) throws Exception;

    /**
     *
     * @param mode
     */
    public void setMode(SenderMode mode);

    /**
     * Zaregitruje SenderListener
     * @param listener
     */
    public void registerSenderListener(SenderListener listener);

    public MessageSender createAndConnectNewMessageSender(TelnetServer server)throws IOException;
}
